const Router = require('koa-router')
const {
  RegisterValidator,
  UpdateValidator,
  DeleteValidator,
  PageValidator,
} = require('../../validator/validator')
const { User } = require('../../models/user')
const { _Success, _Response } = require('../../lib/helper')
const router = new Router({
  prefix: '/v1/user',
})

/**
 * @api {post} http://localhost:3000/v1/user/register 用户注册
 * @apiName 用户注册API
 * @apiGroup 该接口用于用户注册
 *
 * @apiParam {String} email  用户邮箱.
 * @apiParam {String} nickname  用户昵称.
 * @apiParam {String} password  用户密码.
 *
 * @apiSuccess {String} msg  响应信息
 * @apiSuccess {Number} error_code  状态码
 * @apiSuccess {String} request  请求URL
 *
 * @apiSuccessExample 成功响应:
 *     HTTP/1.1 200 OK
 *     {
 *      "msg": "success",
 *      "error_code": 0,
 *      "request": "POST /v1/user/register"
 *     }
 *
 * @apiError 10000 1.邮箱已存在，2.密码不相同.
 *
 * @apiErrorExample 错误响应:
 *     HTTP/1.1 10000 Internal Server Error
 *    {
 *       "msg": [
 *          "两个密码必须相同",
 *          "emali已存在"
 *      ],
 *      "error_code": 10000,
 *      "request": "POST /v1/user/register"
 *    }
 */

// 用户注册
router.post('/register', async (ctx, next) => {
  // RegisterValidator 验证参数是否合法
  const v = await new RegisterValidator().validate(ctx)
  // v.get('body.参数名'), 获取提交的参数
  const user = {
    email: v.get('body.email'),
    password: v.get('body.password2'),
    nickname: v.get('body.nickname'),
  }
  // User.create 添加一条记录
  const result = await User.create(user)
  // _Success 通过抛出异常的方式来通知前端
  _Success()
})
router.get('/list', async (ctx, next) => {
  // RegisterValidator 验证参数是否合法
  const v = await new PageValidator().validate(ctx)
  // v.get('body.参数名'), 获取提交的参数
  const queryparams = {
    queryNum: v.get('query.querynum'),
    querySize: v.get('query.querysize'),
  }
  // User.create 添加一条记录
  const data = await User.findAll({
    attributes:['id','nickname','email','created_at'],
    order: [['id', 'DESC']],
    limit: parseInt(queryparams.querySize), // 每页多少条
    offset: parseInt(queryparams.querySize * (queryparams.queryNum - 1)), // 跳过多少条
  })
  // _Success 通过抛出异常的方式来通知前端
  _Response(ctx, { data, msg: '获取成功', code: 200 })
})
// 用户信息修改
router.put('/update', async (ctx, next) => {
  // UpdateValidator 验证参数是否合法
  const v = await new UpdateValidator().validate(ctx)
  // v.get('body.参数名'), 获取提交的参数
  let email = v.get('body.email')
  const user = {
    password: v.get('body.password'),
    nickname: v.get('body.nickname'),
  }
  // User.update 修改一条记录
  const result = await User.update(user, {
    where: {
      email,
    },
  })
  // _Success 通过抛出异常的方式来通知前端
  _Success()
})
// 删除用户信息
router.delete('/del', async (ctx, next) => {
  const v = await new DeleteValidator().validate(ctx)
  const id = v.get('body.id')
  const result = await User.destroy({
    where: {
      email: id,
    },
  })
  _Success()
})
// 用户登录
router.post('/login', async (ctx, next) => {
  // RegisterValidator 验证参数是否合法
  const v = await new RegisterValidator().validate(ctx)
  // v.get('body.参数名'), 提取参数进行数据库查询比对
  const user = {
    email: v.get('body.email'),
    password: v.get('body.password2'),
  }
  // User.findOne 查询数据库对应记录
  const result = await User.findOne(user)
  // _Success 通过抛出异常的方式来通知前端
  _Success()
})
// 小程序登录
module.exports = router
